home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / pao / tsr / src / aclampx.asm < prev    next >
Assembly Source File  |  1994-06-01  |  36KB  |  1,103 lines

  1. ;============================================================================
  2. ;    << MASM V5.1 >>  for  FM TOWNS
  3. ;============================================================================
  4. .186
  5.     PAGE        60,132
  6.     NAME        ACLAMPX
  7.     TITLE        Access Lamp 2
  8. ;============================================================================
  9. ;    Access Lamp program (FMシリーズ)
  10. ;
  11. ;    全ディスクアクセスの状態表示をする.
  12. ;
  13. ;    All Rights Reserved, Copyright (C) Y.Hirata 1990-1993.
  14. ;    Programmed by Y.Hirata ( NIFTY-ID : NAB03321 )
  15. ;
  16. ;    Spetial Thanks : PATCH MAN ( NIFTY-ID : NAC01123 )
  17. ;
  18. ;    < NOTE >
  19. ;    ● アセンブル方法 ●
  20. ;    中解像度: masm aclampX,aclamp5X;
  21. ;    高解像度: masm /DHIGH_RESO aclampX,aclamp7X;
  22. ;============================================================================
  23. code        SEGMENT
  24.             ASSUME    cs:code,ds:code,es:code,ss:code
  25. ;----------------------------------------------------------------------------
  26.             ORG        000h
  27. SEGTOP        LABEL    BYTE
  28. ;----------------------------------------------------------------------------
  29.             ORG        02Ch
  30. ENVADRS        LABEL    WORD
  31. ;----------------------------------------------------------------------------
  32.             ORG        080h
  33. ARGUMENT    LABEL    BYTE
  34. ;----------------------------------------------------------------------------
  35.             ORG        100h
  36. entry:        jmp        main
  37. ;----------------------------------------------------------------------------
  38. %HIGH_RESO    LABEL    BYTE                    ; 機種別アセンブル用
  39. ;
  40. CR            EQU        0Dh                        ;
  41. LF            EQU        0Ah                        ;
  42. BEL            EQU        07h                        ;
  43. TAB            EQU        09h                        ;
  44. EOF            EQU        1Ah                        ;
  45. ;
  46. COPYRIGHT    DB        CR
  47.             DB        01Bh,'[2K',CR,LF,BEL
  48.             DB        CR,LF,TAB
  49.             DB        'Access Lamp 2  Version 1.01   1993.03.02'
  50.             DB        CR,LF,TAB
  51. ;///////////////////////////////////////////;
  52. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  53.             DB        '( Middle Resolution Display Type )',CR,LF
  54. ELSE                                        ; ● 高解像度 ●
  55.             DB        '( High Resolution Display Type )',CR,LF
  56. ENDIF                                        ;
  57. ;///////////////////////////////////////////;
  58.             DB        CR,LF,TAB
  59.             DB        'Copyright (C) Y.Hirata 1990-1993.',CR,LF
  60.             DB        CR,LF,EOF
  61. ;
  62. ;///////////////////////////////////////////;
  63. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  64. TITLE_name    DB        'Access Lamp2 R50系'    ; 常駐チェック用文字列
  65. ELSE                                        ; ● 高解像度 ●
  66. TITLE_name    DB        'Access Lamp2 R70系'    ; 常駐チェック用文字列
  67. ENDIF                                        ;
  68. ;///////////////////////////////////////////;
  69. TITLE_len    EQU        $-TITLE_name            ;
  70. ;
  71. ;///////////////////////////////////////////;
  72. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  73. TVRAM        EQU        0C800h                    ; テキストVRAMセグメント
  74. KANJI        EQU        0CA00h                    ; 漢字VRAMセグメント
  75. ELSE                                        ; ● 高解像度 ●
  76. TVRAM        EQU        0F800h                    ; テキストVRAMセグメント
  77. AVRAM        EQU        0FA00h                    ; アトリビュートセグメント
  78. ENDIF                                        ;
  79. ;///////////////////////////////////////////;
  80. ;
  81. INT_TIME    EQU        97h                        ; タイマ管理BIOS
  82. INT_MODE    EQU        0                        ; 割り込みモード : インターバルモード
  83. INT_INF        EQU        0                        ; 割り込みモード使用
  84. ;
  85. NDEVICE        EQU        19                        ; 表示種類数
  86. DEV_FD        EQU        020h                    ; デバイス : FD
  87. DEV_HD        EQU        0B0h                    ;        : HD
  88. DEV_ICM        EQU        050h                    ;        : ICメモリカード
  89. DEV_CD        EQU        0C0h                    ;        : CD
  90. DEV_RAM        EQU        040h                    ;        : RAM
  91. DEV_ROM        EQU        042h                    ;        : ROM
  92. DEV_SRAM    EQU        041h                    ;        : SRAM
  93. DEV_BRAM    EQU        043h                    ;        : バックアップRAM
  94. ;
  95. ;****************************************************************************
  96. ;            データ領域
  97. ;****************************************************************************
  98. vct93h        DD        FAR                        ; DISK-BIOS
  99. int93flg    DB        0                        ; DISK-BIOS処理フラグ
  100. itimflg        DB        0                        ; 多重割り込み防止用
  101. ;
  102. timecnt        DW        NDEVICE dup(0)            ; インターバルタイマのカウンタ
  103. parablock    DB        INT_MODE                ;
  104.             DB        0                        ;
  105.             DW        OFFSET itimhandr        ; ハンドラ・オフセット
  106.             DW        ?                        ; ハンドラ・セグメント
  107.             DW        0                        ;
  108.             DW        1                        ; 10ms のインターバル設定
  109. itimerno    DB        ?                        ; タイマ管理番号
  110. dispoff        DW        0,3,6,9                    ; FD0~3
  111.             DW        13,16,19,22,25,28,31    ; HD0~6
  112.             DW        35,38                    ; IC0~1
  113.             DW        42                        ; CD
  114.             DW        45,48,51,54                ; RAM,ROM,SRAM,バックアップRAM
  115.             DW        58                        ; ??
  116. ;
  117. paraoff        LABEL    BYTE                    ;
  118. dispx        DW        0                        ; 表示位置(桁) 0~
  119. dispy        DW        24                        ; 表示位置(行) 0~
  120. funcflg        DB        0                        ; R/W以外のファンクション表示フラグ
  121. revflg        DW        0800h                    ; 反転表示
  122. eracetime    DW        50                        ; 表示消去時間(10ms単位)
  123. parasize    EQU        $-paraoff                ; パラメタ領域サイズ
  124. ;///////////////////////////////////////////;
  125. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  126. rcol        DW        2400h                    ; 反転?/強調/GREEN
  127. wcol        DW        2200h                    ; 反転?/強調/RED
  128. xcol        DW        0700h                    ; 反転?/WHITE
  129. ecol        DW        0100h                    ; BLUE
  130. ELSE                                        ; ● 高解像度 ●
  131. rcol        DW        000Ch                    ; 反転?/強調/GREEN
  132. wcol        DW        000Ah                    ; 反転?/強調/RED
  133. xcol        DW        0007h                    ; 反転?/WHITE
  134. ecol        DW        0001h                    ; BLUE
  135. ENDIF                                        ;
  136. ;///////////////////////////////////////////;
  137. ;
  138. dispcol        DW        ?                        ; 表示属性
  139. dispmsgp    DW        ?                        ; 表示メッセージ
  140. dispxoff    DW        ?                        ; 表示位置
  141. dispno        DW        ?                        ; 表示種別
  142. dispflg        DB        NDEVICE dup(0)            ; 書き換え用(表示中フラグ)
  143. ;
  144. rax            DW        0                        ; AX
  145. ;
  146. FD0msg        DB        'F0',0                    ; FD0
  147. FD1msg        DB        'F1',0                    ; FD1
  148. FD2msg        DB        'F2',0                    ; FD2
  149. FD3msg        DB        'F3',0                    ; FD3
  150. HD0msg        DB        'H0',0                    ; HD0
  151. HD1msg        DB        'H1',0                    ; HD1
  152. HD2msg        DB        'H2',0                    ; HD2
  153. HD3msg        DB        'H3',0                    ; HD3
  154. HD4msg        DB        'H4',0                    ; HD4
  155. HD5msg        DB        'H5',0                    ; HD5
  156. HD6msg        DB        'H6',0                    ; HD6
  157. ICM0msg        DB        'I0',0                    ; ICメモリカード0
  158. ICM1msg        DB        'I1',0                    ; ICメモリカード1
  159. CDmsg        DB        'CD',0                    ; CD
  160. ;-------------------------------------------; メモリディスク
  161. RAMmsg        DB        'RA',0                    ; RAM
  162. ROMmsg        DB        'RO',0                    ; ROM
  163. SRAMmsg        DB        'SR',0                    ; SRAM
  164. BRAMmsg        DB        'BR',0                    ; バックアップRAM
  165. ;
  166. sixteen        DB        16                        ;
  167. XXmsg        DB        'XX',0                    ; ??
  168. ;
  169. DispTable    DB        DEV_FD                    ; FD0 (No.0)
  170.             DW        OFFSET FD0msg            ;
  171.             DB        DEV_FD+1                ; FD1 (No.1)
  172.             DW        OFFSET FD1msg            ;
  173.             DB        DEV_FD+2                ; FD2 (No.2)
  174.             DW        OFFSET FD2msg            ;
  175.             DB        DEV_FD+3                ; FD3 (No.3)
  176.             DW        OFFSET FD3msg            ;
  177.             DB        DEV_HD                    ; HD0 (No.4)
  178.             DW        OFFSET HD0msg            ;
  179.             DB        DEV_HD+1                ; HD1 (No.5)
  180.             DW        OFFSET HD1msg            ;
  181.             DB        DEV_HD+2                ; HD2 (No.6)
  182.             DW        OFFSET HD2msg            ;
  183.             DB        DEV_HD+3                ; HD3 (No.7)
  184.             DW        OFFSET HD3msg            ;
  185.             DB        DEV_HD+4                ; HD4 (No.8)
  186.             DW        OFFSET HD4msg            ;
  187.             DB        DEV_HD+5                ; HD5 (No.9)
  188.             DW        OFFSET HD5msg            ;
  189.             DB        DEV_HD+6                ; HD6 (No.10)
  190.             DW        OFFSET HD6msg            ;
  191.             DB        DEV_ICM                    ; IC0 (No.11)
  192.             DW        OFFSET ICM0msg            ;
  193.             DB        DEV_ICM+1                ; IC1 (No.12)
  194.             DW        OFFSET ICM1msg            ;
  195. CDtable        DB        DEV_CD                    ; CD (No.13)
  196.             DW        OFFSET CDmsg            ;
  197.             DB        DEV_RAM                    ; RAM (No.14)
  198.             DW        OFFSET RAMmsg            ;
  199.             DB        DEV_ROM                    ; ROM (No.15)
  200.             DW        OFFSET ROMmsg            ;
  201.             DB        DEV_SRAM                ; SRAM (No.16)
  202.             DW        OFFSET SRAMmsg            ;
  203.             DB        DEV_BRAM                ; バックアップRAM (No.17)
  204.             DW        OFFSET BRAMmsg            ;
  205. DispTblEnd    DB        ?                        ; ??
  206.             DW        OFFSET XXmsg            ;
  207. ;
  208. ;****************************************************************************
  209. ;            MACRO
  210. ;****************************************************************************
  211. TSREND        MACRO                            ; プログラム常駐終了(31H)
  212.             local    close                    ;
  213.             mov        cx,5                    ; デフォルトオープンファイルのクローズ
  214. close:                                        ;
  215.             mov        bx,cx                    ;
  216.             dec        bx                        ; ( 0 ~ 4 )
  217.             mov        ah,3Eh                    ; ファイルクローズ
  218.             int        21h                        ;
  219.             loop    close                    ;
  220. ;
  221.             mov        si,OFFSET ENVADRS        ; 環境変数領域を開放
  222.             mov        ax,cs:[si]                ;
  223.             mov        es,ax                    ;
  224.             mov        ah,49h                    ;
  225.             int        21h                        ;
  226. ;
  227.             mov        dx,OFFSET SEGEND        ;
  228.             add        dx,15                    ;
  229.             shr        dx,4                    ; パラグラフ単位
  230.             mov        ax,3100h                ;
  231.             int        21h                        ; 常駐終了
  232.             ENDM                            ;
  233. ;----------------------------------------------------------------------------
  234. PRGEND        MACRO                            ; プログラム終了(4CH)
  235.             mov        ax,4C00h                ;
  236.             int        21h                        ; Program End !
  237.             ENDM                            ;
  238. ;----------------------------------------------------------------------------
  239. INT93H        MACRO                            ; DISK-BIOS call
  240.             pushf                            ;
  241.             call    cs:[vct93h]                ;
  242.             ENDM                            ;
  243. ;----------------------------------------------------------------------------
  244. CONVERT        MACRO    val,base,dest            ; 数字(0~15)->文字
  245.             local    table,start                ;
  246.             jmp        short start                ;
  247. table        DB        "0123456789ABCDEF"        ;
  248. start:                                        ;
  249.             push    ax                        ;
  250.             push    bx                        ;
  251.             push    dx                        ;
  252.             mov        al,val                    ;
  253.             xor        ah,ah                    ; AH=0
  254.             xor        bx,bx                    ; BX=0
  255.             div        base                    ; AX/base->AL(商),AH(剰余)
  256.             mov        bl,al                    ;
  257.             mov        al,cs:table[bx]            ;
  258.             mov        dest,al                    ;
  259.             mov        bl,ah                    ;
  260.             mov        al,cs:table[bx]            ;
  261.             mov        dest[1],al                ;
  262.             pop        dx                        ;
  263.             pop        bx                        ;
  264.             pop        ax                        ;            
  265.             ENDM                            ;
  266. ;
  267. ;****************************************************************************
  268. ;            常駐処理部
  269. ;****************************************************************************
  270. ;----------------------------------------------------------------------------
  271. ;    テキストVRAM(ANK文字列)描画
  272. ;    < IN  >    : スタック(8バイト使用)
  273. ;    < OUT >    : 文字コード+文字属性
  274. ;----------------------------------------------------------------------------
  275. TVputs        PROC    NEAR                    ;
  276.             push    bp                        ;
  277.             mov        bp,sp                    ; スタックフレーム形成
  278.             push    ax                        ; 使用レジスタ退避
  279.             push    dx                        ;
  280.             push    bx                        ;
  281.             push    si                        ;
  282.             push    es                        ;
  283. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 引数
  284. ;            [bp+4]    x (0~)                    ; WORD: 桁
  285. ;            [bp+6]    y (0~)                    ; WORD: 行
  286. ;            [bp+8]    *str                    ; WORD: 文字列アドレス
  287. ;            [bp+10]    attr                    ; WORD: 表示属性
  288. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  289.             mov        bx,WORD PTR [bp+4]        ; x
  290.             shl        bx,1                    ;
  291. ;;            mov        ax,160                    ;
  292. ;;            imul    WORD PTR [bp+6]            ; y
  293.             mov        ax,WORD PTR [bp+6]        ; y
  294.             shl        ax,7                    ; y*128
  295.             add        bx,ax                    ;
  296.             mov        ax,WORD PTR [bp+6]        ; y
  297.             shl        ax,5                    ; y*32
  298.             add        bx,ax                    ; 2*x+160*y = offset
  299. ;///////////////////////////////////////////;
  300. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  301.             mov        ax,TVRAM                ;
  302.             mov        es,ax                    ; text vram segment
  303.             mov        si,WORD PTR [bp+8]        ; str
  304.             mov        ax,WORD PTR [bp+10]        ; attr(AHのみ使用)
  305. TVputslp:                                    ;
  306.             mov        al,BYTE PTR [si]        ;
  307.             or        al,al                    ; 文字列終端 ?
  308.             jz        short TVputsend            ; YES->TVputsend
  309. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  310. ;    WORD ACCESS                                ;
  311. ;            mov        WORD PTR es:[bx],ax        ; text vram
  312. ;            inc        bx                        ;
  313. ;            inc        bx                        ; offset update
  314. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  315. ;    BYTE ACCESS                                ; 16β互換はWORD ACCESS不可
  316.             mov        BYTE PTR es:[bx],al        ; code->text vram
  317.             inc        bx                        ;
  318.             mov        BYTE PTR es:[bx],ah        ; attr->text vram
  319.             inc        bx                        ;
  320. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  321. ELSE                                        ; ● 高解像度 ●
  322.             mov        ax,TVRAM                ;
  323.             mov        es,ax                    ; code segment
  324.             mov        si,WORD PTR [bp+8]        ; str
  325.             mov        dx,WORD PTR [bp+10]        ; attr
  326. TVputslp:                                    ;
  327.             mov        al,BYTE PTR [si]        ;
  328.             or        al,al                    ; 文字列終端 ?
  329.             jz        short TVputsend            ; YES->TVputsend
  330. ;
  331.             sub        ah,ah                    ;
  332.             mov        WORD PTR es:[bx],ax        ; code->text vram
  333.             push    es                        ;
  334.             mov        ax,AVRAM                ; attribute segment
  335.             mov        es,ax                    ;
  336.             mov        WORD PTR es:[bx],dx        ; attr->text vram
  337.             pop        es                        ;
  338.             inc        bx                        ;
  339.             inc        bx                        ; offset update
  340. ENDIF                                        ;
  341. ;///////////////////////////////////////////;
  342.             inc        si                        ;
  343.             jmp        short TVputslp            ;
  344. TVputsend:                                    ;
  345.             pop        es                        ; 使用レジスタ復元
  346.             pop        si                        ;
  347.             pop        bx                        ;
  348.             pop        dx                        ;
  349.             pop        ax                        ;
  350.             mov        sp,bp                    ; スタックフレーム開放
  351.             pop        bp                        ;
  352.             ret                                ;
  353. TVputs        ENDP                            ;
  354. ;----------------------------------------------------------------------------
  355. ;    int93hファンクション状態表示(ds=csでcall)
  356. ;    < IN  >    : dispcol    表示属性
  357. ;            : dispmsgp    表示文字列先頭アドレス
  358. ;            : dispxoff    表示桁位置
  359. ;            : dispno    表示種別
  360. ;
  361. ;    < USE >    : ax
  362. ;----------------------------------------------------------------------------
  363. int93mon:                                    ;
  364.             push    bx                        ;
  365.             mov        bx,dispno                ;
  366.             mov        BYTE PTR dispflg[bx],1    ; 表示中フラグセット
  367.             shl        bx,1                    ;
  368.             mov        WORD PTR timecnt[bx],0    ; カウンタクリア
  369.             mov        ax,dispcol                ; 表示属性
  370.             or        ax,WORD PTR revflg        ;
  371.             jmp        short int93disp            ;
  372. int93erace:                                    ;
  373.             push    bx                        ;
  374.             mov        bx,dispno                ;
  375.             mov        BYTE PTR dispflg[bx],0    ; 表示中フラグクリア
  376.             shl        bx,1                    ;
  377.             mov        WORD PTR timecnt[bx],0    ; カウンタクリア
  378.             mov        ax,ecol                    ; 表示属性
  379. int93disp:                                    ;
  380.             push    ax                        ;
  381.             mov        ax,dispmsgp                ; 文字列アドレス
  382.             push    ax                        ; str
  383.             mov        ax,dispy                ; 表示位置(行) 0~
  384.             push    ax                        ; y
  385.             mov        ax,dispxoff                ; 表示位置(桁) 0~
  386.             add        ax,dispx                ;
  387.             push    ax                        ; x
  388.             call    TVputs                    ; ファンクション状態表示
  389.             add        sp,8                    ;
  390.             pop        bx                        ;
  391.             ret                                ;
  392. ;----------------------------------------------------------------------------
  393. ;    int93hファンクション状態表示色設定(ds=csでcall)
  394. ;    < RET >    : キャリー    onならば該当色なし
  395. ;
  396. ;    < USE >    : ax
  397. ;----------------------------------------------------------------------------
  398. setcolor:                                    ;
  399.             mov        ax,rax                    ; DISK-BIOS呼出時のAX
  400.             cmp        ah,05h                    ; read ?
  401.             jne        short setcol_wchk        ; NO->次のチェック
  402.             mov        ax,rcol                    ;
  403.             mov        dispcol,ax                ;
  404.             jmp        short setcol_dev        ;
  405. setcol_wchk:                                ;
  406.             cmp        ah,06h                    ; write ?
  407.             jne        short setcol_echk        ; NO->その他へ
  408.             mov        ax,wcol                    ;
  409.             mov        dispcol,ax                ;
  410.             jmp        short setcol_dev        ;
  411. setcol_echk:                                ;
  412.             cmp        BYTE PTR funcflg,1        ; R/W以外のファンクション表示 ?
  413.             je        short setcol_etc        ; YES->色設定
  414.             jmp        short setcol_end        ; NO ->終了
  415. setcol_etc:                                    ;
  416.             mov        ax,xcol                    ; その他
  417.             mov        dispcol,ax                ;
  418. setcol_dev:                                    ;
  419.             clc                                ;
  420.             ret                                ;
  421. setcol_end:                                    ;
  422.             stc                                ; キャリーon
  423.             ret                                ;
  424. ;----------------------------------------------------------------------------
  425. ;    int93hファンクション状態表示メッセージ設定
  426. ;    (ds=csでcall)
  427. ;    < IN  >    : rax        DISK-BIOS呼出時のAX
  428. ;    < RET >    : dispmsgp    表示文字列先頭アドレス
  429. ;            : dispxoff    表示桁位置
  430. ;            : dispno    表示種別
  431. ;
  432. ;    < USE >    : ax
  433. ;----------------------------------------------------------------------------
  434. setmessage:                                    ;
  435.             push    bx                        ;
  436.             push    si                        ;
  437.             xor        bx,bx                    ;
  438.             mov        ax,rax                    ; DISK-BIOS呼出時のAX
  439.             and        al,0F0h                    ; ユニット番号無視
  440.             cmp        al,DEV_CD                ;
  441.             jz        short setmsg_cd            ;
  442.             mov        ax,rax                    ; DISK-BIOS呼出時のAX
  443. setmsg_cd:                                    ;
  444.             mov        si,OFFSET DispTable        ;
  445. setmsg_lp:                                    ; デバイスチェック
  446.             cmp        al,[si]                    ;
  447.             je        short setmsg_disk        ;
  448.             add        si,3                    ;
  449.             inc        bx                        ;
  450.             cmp        si,OFFSET DispTblEnd    ;
  451.             jne        short setmsg_lp            ;
  452. setmsg_xx:                                    ; 不明デバイス処理
  453.             mov        ax,rax                    ; その他
  454.             CONVERT    al,sixteen,XXmsg[0]        ; AL
  455. setmsg_disk:                                ; ディスク処理
  456.             mov        ax,[si+1]                ;
  457.             mov        dispmsgp,ax                ; 表示文字列先頭アドレス
  458.             mov        dispno,bx                ; 表示種別
  459.             shl        bx,1                    ;
  460.             mov        ax,dispoff[bx]            ;
  461.             mov        dispxoff,ax                ; 表示桁位置
  462.             pop        si                        ;
  463.             pop        bx                        ;
  464.             ret                                ;
  465. ;----------------------------------------------------------------------------
  466. ;    インターバルタイマ割り込み処理                    ; タイマ管理BIOS使用
  467. ;----------------------------------------------------------------------------
  468. itimhandr    PROC    FAR                        ; 割り込みハンドラ
  469.             cli                                ;
  470.             cmp        BYTE PTR cs:itimflg,1    ; 処理中 ?
  471.             jne        short itim_st            ; NO->処理開始
  472.             sti                                ;
  473.             ret                                ;
  474. itim_st:                                    ;
  475.             mov        BYTE PTR cs:itimflg,1    ; 処理中フラグセット
  476.             mov        ax,cs                    ;
  477.             mov        ds,ax                    ;
  478.             mov        es,ax                    ; es=ds=cs
  479.             cld                                ;
  480.             cmp        BYTE PTR int93flg,1        ; DISK-BIOS処理あり ?
  481.             jne        short itim_eracechk        ; NO ->消去処理へ
  482. itim_disp:                                    ; YES->表示処理開始
  483.             call    setcolor                ; 表示色設定
  484.             jc        short itim_dispend        ;
  485.             call    setmessage                ; 表示メッセージ設定
  486.             call    int93mon                ; ファンクション状態表示
  487. itim_dispend:                                ;
  488.             mov        BYTE PTR int93flg,0        ; DISK-BIOS処理フラグクリア
  489. itim_eracechk:                                ;
  490.             xor        bx,bx                    ;
  491.             mov        si,OFFSET DispTable        ;
  492.             inc        si                        ;
  493. itim_erace_lp:                                ;
  494.             cmp        BYTE PTR dispflg[bx],1    ; 表示中 ?
  495.             jne        short itim_next            ; NO->次のデバイス
  496.             mov        ax,eracetime            ;
  497.             shl        bx,1                    ;
  498.             cmp        timecnt[bx],ax            ;
  499.             jae        short itim_erace        ; 表示消去時間以上ならば消去
  500.             inc        WORD PTR timecnt[bx]    ; カウントアップ
  501.             shr        bx,1                    ;
  502.             jmp        short itim_next            ;
  503. itim_erace:                                    ;
  504.             mov        ax,[si]                    ;
  505.             mov        dispmsgp,ax                ; 表示文字列先頭アドレス
  506.             mov        ax,dispoff[bx]            ;
  507.             mov        dispxoff,ax                ; 表示桁位置
  508.             shr        bx,1                    ;
  509.             mov        dispno,bx                ; 表示種別
  510.             call    int93erace                ; 表示消去
  511. itim_next:                                    ;
  512.             inc        bx                        ;
  513.             add        si,3                    ;
  514.             cmp        bx,NDEVICE                ;
  515.             jb        short itim_erace_lp        ;
  516. itim_end:                                    ;
  517.             mov        BYTE PTR cs:itimflg,0    ; 処理中フラグクリア
  518.             sti                                ;
  519.             ret                                ;
  520. itimhandr    ENDP                            ;
  521. ;----------------------------------------------------------------------------
  522. ;    DISK-BIOSの横取り処理
  523. ;----------------------------------------------------------------------------
  524. INT93hook    PROC    FAR                        ;
  525.             mov        cs:rax,ax                ; DISK-BIOS呼出時のAX保存
  526.             INT93H                            ; DISK-BIOS call
  527.             mov        BYTE PTR cs:int93flg,1    ; DISK-BIOS処理フラグセット
  528.             sti                                ; 割り込み許可
  529.             ret        2                        ; フラグをpopせずに,iretをシミュレート
  530. INT93hook    ENDP                            ;
  531. ;----------------------------------------------------------------------------
  532. SEGEND        LABEL    BYTE                    ; ↑ここまでを常駐
  533. ;----------------------------------------------------------------------------
  534. ;
  535. ;****************************************************************************
  536. ;            非常駐処理部
  537. ;****************************************************************************
  538. ;----------------------------------------------------------------------------
  539. ;    文字列表示(^C無効)
  540. ;    < IN  >    : ds:si    文字列格納位置    
  541. ;
  542. ;    < USE >    : si
  543. ;----------------------------------------------------------------------------
  544. puts        PROC    NEAR                    ;
  545.             push    dx                        ;
  546. putslp:                                        ;
  547.             mov        dl,[si]                    ;
  548.             or        dl,dl                    ; 文字列終端 ?
  549.             jz        short putsend            ; YES->終了
  550.             mov        ah,02                    ;
  551.             int        21h                        ; 文字表示
  552.             inc        si                        ;
  553.             jmp        short putslp            ;
  554. putsend:                                    ;
  555.             pop        dx                        ;
  556.             ret                                ;
  557. puts        ENDP                            ;
  558. ;----------------------------------------------------------------------------
  559. ;    表示クリア(ds=csでcall)
  560. ;
  561. ;    < USE >    : ax
  562. ;----------------------------------------------------------------------------
  563. dispclr:                                    ;
  564. ;///////////////////////////////////////////;
  565. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  566.             mov        ax,0700h                ; 白
  567. ELSE                                        ; ● 高解像度 ●
  568.             mov        ax,0007h                ; 白
  569. ENDIF                                        ;
  570. ;///////////////////////////////////////////;
  571.             push    ax                        ;
  572.             mov        ax,OFFSET clrmsg        ; 文字列アドレス
  573.             push    ax                        ; str
  574.             mov        ax,_dispy                ; 表示位置(行) 0~
  575.             push    ax                        ; y
  576.             mov        ax,_dispx                ; 表示位置(桁) 0~
  577.             push    ax                        ; x
  578.             call    TVputs                    ;
  579.             add        sp,8                    ;
  580.             ret                                ;
  581. ;----------------------------------------------------------------------------
  582. ;    表示初期設定(ds=csでcall)
  583. ;
  584. ;    < USE >    : ax, bx, si
  585. ;----------------------------------------------------------------------------
  586. dispsetup:                                    ;
  587.             xor        bx,bx                    ;
  588.             mov        si,OFFSET DispTable        ;
  589.             inc        si                        ;
  590. dispsetup_lp:                                ;
  591.             mov        ax,[si]                    ;
  592.             mov        dispmsgp,ax                ; 表示文字列先頭アドレス
  593.             mov        dispno,bx                ; 表示種別
  594.             shl        bx,1                    ;
  595.             mov        ax,dispoff[bx]            ;
  596.             shr        bx,1                    ;
  597.             mov        dispxoff,ax                ; 表示桁位置
  598.             call    int93erace                ; 表示消去
  599.             inc        bx                        ;
  600.             add        si,3                    ;
  601.             cmp        bx,NDEVICE                ;
  602.             jb        short dispsetup_lp        ;
  603.             ret                                ;
  604. ;----------------------------------------------------------------------------
  605. ;    DISK-BIOSベクタ取得(ds=csでcall)
  606. ;    < RET >    : es:bx    ベクタアドレス
  607. ;----------------------------------------------------------------------------
  608. getvct:                                        ;
  609.             mov        ax,3593h                ;
  610.             int        21h                        ; DISK-BIOS割込みベクタ取得
  611.             mov        WORD PTR vct93h,bx        ;
  612.             mov        WORD PTR vct93h+2,es    ; 本来のDISK-BIOSベクタの取得・保存
  613.             ret                                ;
  614. ;----------------------------------------------------------------------------
  615. ;    常駐文字列チェック(ds=csでcall)
  616. ;    < IN  >    : es    常駐セグメント
  617. ;    < RET >    : ゼロフラグ (等しければ, ゼロフラグon)
  618. ;
  619. ;    < USE >    : si, di
  620. ;----------------------------------------------------------------------------
  621. tsrcmp:                                        ;
  622.             mov        cx,TITLE_len            ;
  623.             mov        si,OFFSET TITLE_name    ; ds:si
  624.             mov        di,OFFSET TITLE_name    ; es:di
  625.     repz    cmpsb                            ; 常駐チェック
  626.             ret                                ;
  627. ;----------------------------------------------------------------------------
  628. ;    常駐チェック(ds=csでcall)
  629. ;    < RET >    : es:bx    常駐アドレス
  630. ;
  631. ;    < USE >    : ax, si, di
  632. ;----------------------------------------------------------------------------
  633. tsr_chk:                                    ;
  634.             mov        BYTE PTR tsrflg,0        ; 常駐フラグクリア
  635.             mov        BYTE PTR hookflg,0        ; ベクタフックフラグクリア
  636. mcb_chk:                                    ;
  637.             mov        ah,52h                    ; 内部変数領域アドレス取得
  638.             int        21h                        ;
  639.             mov        es,es:[bx-2]            ; 先頭MCBセグメントアドレス
  640. mcb_lp:                                        ;
  641.             cmp        BYTE PTR es:[0],'Z'        ; 最終MCB ?
  642.             je        short mcb_end            ; YES->終了
  643.             cmp        BYTE PTR es:[0],'M'        ; MCB ?
  644.             jne        short mcb_err            ; NO ->MCB MARK ERROR
  645. mcb_idchk:                                    ;
  646.             push    es                        ; MCBセグメント退避
  647.             mov        es,WORD PTR es:[1]        ; PSPセグメント(Owner ID)
  648.             mov        ax,es                    ;
  649.             cmp        ax,pspseg                ; 起動プログラムのPSPか ?
  650.             je        short mcb_next            ; YES->次のMCBをチェック
  651.             call    tsrcmp                    ; 常駐文字列照合
  652.             jz        short mcb_on            ; 等しければ, 常駐済
  653. mcb_next:                                    ;
  654.             pop        es                        ; MCBセグメント復元
  655.             mov        ax,es                    ;
  656.             add        ax,es:[3]                ; 使用メモリのパラグラフ数加算
  657.             inc        ax                        ; 次のMCBセグメント
  658.             mov        es,ax                    ;
  659.             jmp        short mcb_lp            ;
  660. mcb_on:                                        ; 常駐済
  661.             pop        ax                        ; スタック調整
  662.             mov        BYTE PTR tsrflg,1        ;
  663. mcb_end:                                    ; 非常駐
  664.             push    bx                        ;
  665.             push    es                        ;
  666.             call    getvct                    ; DISK-BIOS割込みベクタ取得
  667.             pop        es                        ;
  668.             pop        bx                        ;
  669. vctchk_00:                                    ;
  670.             mov        ax,es                    ;
  671.             cmp        WORD PTR vct93h+2,ax    ; 常駐セグメント比較
  672.             je        short vctchk_99            ;
  673.             mov        BYTE PTR hookflg,1        ; ベクタフックされている
  674. vctchk_99:                                    ;
  675.             ret                                ;
  676. mcb_err:                                    ;
  677.             mov        si,OFFSET msg6            ; MCBエラー
  678.             call    puts                    ;
  679.             ret                                ;
  680. ;----------------------------------------------------------------------------
  681. ;    インターバルタイマの登録(ds=cs)
  682. ;    < RET >    : ax    タイマ管理BIOSの返り値
  683. ;----------------------------------------------------------------------------
  684. itim_setup:                                    ;
  685.             push    di                        ;
  686.             mov        WORD PTR [parablock+4],cs
  687.             mov        di,OFFSET parablock        ;
  688.             xor        ax,ax                    ;
  689.             int        INT_TIME                ;
  690.             mov        itimerno,al                ; タイマ管理番号
  691.             pop        di                        ;
  692.             ret                                ;
  693. ;----------------------------------------------------------------------------
  694. ;    インターバルタイマの取消
  695. ;    < IN  >    : es    常駐セグメント
  696. ;    < RET >    : ax    タイマ管理BIOSの返り値
  697. ;----------------------------------------------------------------------------
  698. itim_release:                                ;
  699.             mov        ah,01h                    ;
  700.             mov        al,es:itimerno            ; 常駐部分のタイマ番号
  701.             int        INT_TIME                ;
  702.             ret                                ;
  703. ;----------------------------------------------------------------------------
  704. ;    プログラム名の設定(es=ds=csでcall)
  705. ;    常駐時の識別用として, コマンドライン領域にプログラム名を複写しておく.
  706. ;----------------------------------------------------------------------------
  707. setpname:                                    ;
  708.             mov        si,OFFSET prgname        ;
  709.             mov        di,OFFSET ARGUMENT        ;
  710.             mov        cx,prgnamelen            ;
  711.     rep        movsb                            ; ds:si->es:di
  712.             ret                                ;
  713. ;----------------------------------------------------------------------------
  714. ;    起動処理( メイン )
  715. ;----------------------------------------------------------------------------
  716. main        PROC    NEAR                    ;
  717.             mov        WORD PTR pspseg,es        ; PSPセグメント保存
  718.             cli                                ; 割り込み禁止
  719.             cld                                ;
  720. ;
  721.             mov        si,OFFSET msg0            ; オープニングメッセージ(文字列)
  722.             call    puts                    ;
  723.             call    tsr_chk                    ; 常駐チェック
  724.             cmp        BYTE PTR tsrflg,0        ; 常駐していない ?
  725.             jz        short arg_chk            ; YES->arg_chk
  726. ;
  727.             push    ds                        ; 常駐領域内パラメタを複写
  728.             push    es                        ;
  729.             mov        ax,es                    ;
  730.             push    ds                        ;
  731.             pop        es                        ;
  732.             mov        ds,ax                    ; ds<->es
  733.             mov        si,OFFSET paraoff        ;
  734.             mov        di,OFFSET paraoff        ;
  735.             mov        cx,parasize                ; パラメタ領域サイズ(アップデート用)
  736.     rep        movsb                            ; ds:si->es:di
  737.             mov        si,OFFSET paraoff        ;
  738.             mov        di,OFFSET _paraoff        ;
  739.             mov        cx,parasize                ; パラメタ領域サイズ(保持用)
  740.     rep        movsb                            ; ds:si->es:di
  741.             pop        es                        ;
  742.             pop        ds                        ;
  743. arg_chk:                                    ;
  744.             sti                                ;
  745.             call    argchk                    ; 引数のチェック
  746.             mov        al,argflg                ;
  747.             or        al,al                    ; al=0 ?
  748.             jz        short tsr_init            ; YES->通常処理開始へ
  749.             mov        si,OFFSET usage            ; ヘルプメッセージ
  750.             call    puts                    ;
  751.             PRGEND                            ;
  752. tsr_init:                                    ;
  753.             mov        al,tsrflg                ;
  754.             or        al,al                    ;
  755.             jz        short mem_noclr            ; 終了
  756. ;-------------------------------------------;
  757. ;    常駐解除処理
  758. ;-------------------------------------------;
  759. mem_clear:                                    ;
  760.             mov        al,relflg                ; 常駐解除フラグ
  761.             or        al,al                    ; 常駐解除しない ?
  762.             jz        short mem_update        ; YES->終了
  763. mem_clrchk:                                    ;
  764.             cmp        BYTE PTR hookflg,0        ; ベクタフックされていないか ?
  765.             je        short mem_clear_ok        ; YES->常駐解除
  766.             mov        si,OFFSET msg8            ; 常駐解除不可メッセージ
  767.             call    puts                    ;
  768.             PRGEND                            ;
  769. mem_clear_ok:                                ;
  770.             push    ds                        ;
  771.             lds        dx,DWORD PTR es:vct93h    ;
  772.             mov        ax,2593h                ; DISK-BIOSを元のベクタに!
  773.             int        21h                        ;
  774.             call    itim_release            ; インターバルタイマの解除
  775.             mov        ah,49h                    ; プログラムを開放
  776.             int        21h                        ;
  777.             pop        ds                        ;
  778.             jc        short mem_clrerr        ; メモリ開放失敗
  779.             mov        si,OFFSET msg2            ; 開放メッセージ
  780.             jmp        short mem_clrend        ;
  781. mem_clrerr:                                    ;
  782.             mov        si,OFFSET msg7            ; メモリ開放失敗メッセージ
  783. mem_clrend:                                    ;
  784.             call    puts                    ;
  785.             call    dispclr                    ; 表示クリア
  786.             PRGEND                            ;
  787. ;
  788. mem_update:                                    ; 常駐領域内のパラメタ値変更
  789.             mov        si,OFFSET msg3            ; 常駐済メッセージ
  790.             call    puts                    ;
  791.             mov        al,optflg                ;
  792.             or        al,al                    ; オプション指定なし ?
  793.             jz        short mem_upend            ; YES->終了
  794.             cli                                ;
  795.             call    dispclr                    ; 表示クリア
  796.             mov        si,OFFSET paraoff        ;
  797.             mov        di,OFFSET paraoff        ;
  798.             mov        cx,parasize                ; パラメタ領域サイズ
  799.     rep        movsb                            ; ds:si->es:di
  800.             sti                                ;
  801.             mov        si,OFFSET msg5            ; アップデートメッセージ(文字数)
  802.             call    puts                    ;
  803.             call    dispsetup                ; 初期表示
  804. mem_upend:                                    ;
  805.             PRGEND                            ;
  806. ;
  807. mem_noclr:                                    ;
  808.             mov        al,relflg                ; 常駐解除フラグ
  809.             or        al,al                    ;
  810.             jz        short mem_setup            ;
  811.             mov        si,OFFSET msg4            ; 非常駐メッセージ
  812.             call    puts                    ;
  813.             PRGEND                            ;
  814. ;-------------------------------------------;
  815. ;    常駐処理
  816. ;-------------------------------------------;
  817. mem_setup:                                    ;
  818.             push    cs                        ;
  819.             pop        es                        ; es=cs
  820.             call    setpname                ;
  821.             mov        si,OFFSET msg1            ; 常駐メッセージ
  822.             call    puts                    ;
  823. ;
  824.             call    dispsetup                ; 初期表示
  825.             call    itim_setup                ; インターバルタイマ設定
  826.             mov        dx,OFFSET INT93hook        ; 常駐処理プロシジャを
  827.             mov        ax,2593h                ; ベクタセット
  828.             int        21h                        ; (DISK-BIOS)
  829. ;
  830.             TSREND                            ; 常駐終了
  831. ;----------------------------------------------------------------------------
  832. ;    引数のチェック
  833. ;----------------------------------------------------------------------------
  834. argchk:                                        ; 引数のチェック
  835.             mov        bx,OFFSET ARGUMENT        ;
  836.             mov        BYTE PTR optflg,0        ;
  837. arglp:                                        ;
  838.             inc        bx                        ;
  839.             mov        al,[bx]                    ;
  840.             cmp        al,0DH                    ;
  841.             jne        short optchk            ;
  842.             ret                                ; 引数チェック終了
  843. optchk:                                        ; 引数チェック開始
  844.             cmp        al,'-'                    ; オプションスイッチは'-','/'で始まる.
  845.             je        short optsw1            ;
  846.             cmp        al,'/'                    ;
  847.             je        short optsw1            ;
  848.             cmp        al,' '                    ; SPACE
  849.             je        short arglp                ;
  850.             cmp        al,9H                    ; TAB
  851.             je        short arglp                ;
  852.             jmp        opterr                    ;
  853. optsw1:                                        ;
  854.             inc        bx                        ;
  855.             mov        al,[bx]                    ;
  856.             or        al,20H                    ; 大文字->小文字
  857.             cmp        al,'r'                    ; 'r','R'か ?
  858.             jne        short optsw2            ; NO->次のチェックへ
  859.             mov        BYTE PTR relflg,1        ; 常駐解除フラグ ON
  860.             jmp        short arglp                ;
  861. optsw2:                                        ; R/W以外のファンクション表示
  862.             cmp        al,'f'                    ; 'f'か ?
  863.             jne        short optsw3            ; NO->次のチェックへ
  864.             call    atoi                    ;
  865.             cmp        BYTE PTR valflg,0        ; 数値指定あり ?
  866.             jne        short optsw2chk            ; YES->数値チェックへ
  867.             mov        BYTE PTR funcflg,0        ; 表示フラグ標準値設定
  868.             jmp        short optswon            ;
  869. optsw2chk:                                    ;
  870.             cmp        ax,0                    ;
  871.             jb        short opterr_00            ; 0よりも小さければエラー
  872.             cmp        ax,1                    ;
  873.             ja        short opterr_00            ; 1よりも大きければエラー
  874.             mov        funcflg,al                ; 表示フラグ格納
  875.             jmp        short optswon            ;
  876. optsw3:                                        ; 反転表示
  877.             cmp        al,'v'                    ; 'v'か ?
  878.             jne        short optsw4            ; NO->次のチェックへ
  879.             call    atoi                    ;
  880.             cmp        BYTE PTR valflg,0        ; 数値指定あり ?
  881.             jne        short optsw3chk            ; YES->数値チェックへ
  882.             mov        WORD PTR revflg,0800h    ; 反転表示フラグ標準値設定
  883.             jmp        short optswon            ;
  884. optsw3chk:                                    ;
  885.             or        ax,ax                    ;
  886.             jnz        short optsw3chk2        ; 0以外は次のチェックへ
  887.             mov        revflg,ax                ;
  888.             jmp        short optswon            ;
  889. optsw3chk2:                                    ;
  890.             cmp        ax,1                    ;
  891.             jne        short opterr_00            ; 1でなければエラー
  892.             mov        WORD PTR revflg,0800h    ; 反転表示フラグ格納
  893.             jmp        short optswon            ;
  894. optsw4:                                        ; 表示位置(桁)
  895.             cmp        al,'x'                    ; 'x'か ?
  896.             jne        short optsw5            ; NO->次のチェックへ
  897.             call    atoi                    ;
  898.             cmp        BYTE PTR valflg,0        ; 数値指定あり ?
  899.             jne        short optsw4chk            ; YES->数値チェックへ
  900.             mov        WORD PTR dispx,0        ; 表示位置(桁)標準値設定
  901.             jmp        short optswon            ;
  902. optsw4chk:                                    ;
  903.             cmp        ax,1                    ;
  904.             jb        short opterr            ; 1よりも小さければエラー
  905.             cmp        ax,80                    ;
  906.             ja        short opterr            ; 80よりも大きければエラー
  907.             dec        ax                        ; xは0~79
  908.             mov        dispx,ax                ; 表示位置(桁)格納
  909.             jmp        short optswon            ;
  910. opterr_00:                                    ; 中継
  911.             jmp        short opterr            ; エラーへ
  912. arglp_00:                                    ; 中継
  913.             jmp        arglp                    ; 次の引数処理へ
  914. optpause:                                    ;
  915.             mov        al,[bx+1]                ;
  916.             cmp        al,' '                    ; SPACE
  917.             je        short arglp_00            ;
  918.             cmp        al,9H                    ; TAB
  919.             je        short arglp_00            ;
  920.             cmp        al,0DH                    ; 終了
  921.             je        short arglp_00            ;
  922.             jmp        optsw1                    ;
  923. optswon:                                    ;
  924.             mov        BYTE PTR optflg,1        ; オプションスイッチ ON
  925.             jmp        short optpause            ;
  926. optsw5:                                        ; 表示位置(行)
  927.             cmp        al,'y'                    ; 'y'か ?
  928.             jne        short optsw6            ; NO->次のチェックへ
  929.             call    atoi                    ;
  930.             cmp        BYTE PTR valflg,0        ; 数値指定なし ?
  931.             jne        short optsw5chk            ; NO->数値チェックへ
  932.             mov        WORD PTR dispy,24        ; 表示位置(行)標準値設定
  933.             jmp        short optswon            ;
  934. optsw5chk:                                    ;
  935. ;///////////////////////////////////////////;
  936. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  937.             cmp        ax,1                    ;
  938.             jb        short opterr            ; 1よりも小さければエラー
  939.             cmp        ax,25                    ;
  940.             ja        short opterr            ; 25よりも大きければエラー
  941.             dec        ax                        ; yは0~24
  942.             mov        dispy,ax                ; 表示位置(行)格納
  943. ELSE                                        ; ● 高解像度 ●
  944.             cmp        ax,1                    ;
  945.             jb        short opterr            ; 1よりも小さければエラー
  946.             cmp        ax,30                    ;
  947.             ja        short opterr            ; 30よりも大きければエラー
  948.             dec        ax                        ; yは0~29
  949.             mov        dispy,ax                ; 表示位置(行)格納
  950. ENDIF                                        ;
  951. ;///////////////////////////////////////////;
  952.             jmp        short optswon            ;
  953. optsw6:                                        ; 表示消去時間
  954.             cmp        al,'t'                    ; 't'か ?
  955.             jne        short opterr            ; NO->次のチェックへ
  956.             call    atoi                    ;
  957.             cmp        BYTE PTR valflg,0        ; 数値指定あり ?
  958.             jne        short optsw6chk            ; YES->数値チェックへ
  959.             mov        WORD PTR eracetime,50    ; 表示消去時間標準値設定
  960.             jmp        short optswon            ;
  961. optsw6chk:                                    ;
  962.             cmp        ax,10                    ;
  963.             jb        short opterr            ; 10よりも小さければエラー
  964.             cmp        ax,100                    ;
  965.             ja        short opterr            ; 100よりも大きければエラー
  966.             mov        eracetime,ax            ; 表示消去時間格納
  967.             jmp        short optswon            ;
  968. opterr:                                        ; オプションスイッチエラー
  969.             mov        BYTE PTR argflg,1        ;
  970.             ret                                ;
  971. ;----------------------------------------------------------------------------
  972. ;    文字列を整数に変換
  973. ;    < IN  >    : ds:bx    文字列の先頭位置-1
  974. ;    < RET >    : ax    整数値
  975. ;
  976. ;    < USE >    : bx, cx, dx
  977. ;----------------------------------------------------------------------------
  978. atoi:                                        ;
  979.             inc        bx                        ;
  980.             xor        ax,ax                    ; ax=0
  981.             xor        dx,dx                    ; dx=0
  982.             xor        ch,ch                    ; ch=0
  983.             mov        BYTE PTR valflg,0        ;
  984. atoi_next:                                    ;
  985.             mov        cl,[bx]                    ; 文字コード取得
  986.             sub        cl,'0'                    ; 文字->数字
  987.             jb        short atoi_end            ; '0'よりも小さければ終わり
  988.             cmp        cl,9                    ; '9'よりも大きいか ?
  989.             ja        short atoi_end            ; YESならば終わり
  990.             push    cx                        ;
  991.             mov        cx,0AH                    ;
  992.             imul    cx                        ; AXを10倍する
  993.             pop        cx                        ;
  994.             add        ax,cx                    ; AXに新値を格納
  995.             inc        bx                        ; 次の文字位置
  996.             mov        BYTE PTR valflg,1        ;
  997.             jmp        short atoi_next            ;
  998. atoi_end:                                    ;
  999.             dec        bx                        ; 先読み分を戻す
  1000.             ret                                ;
  1001. ;
  1002. main        ENDP                            ;
  1003. ;-------------------------------------------; 起動前の値を保持する領域
  1004. _paraoff    LABEL    BYTE                    ;
  1005. _dispx        DW        0                        ; 表示位置(桁) 0~
  1006. _dispy        DW        24                        ; 表示位置(行) 0~
  1007. _funcflg    DB        0                        ; R/W以外のファンクション表示フラグ
  1008. _revflg        DW        0800h                    ; 反転表示
  1009. _eracetime    DW        50                        ; 表示消去時間(10ms単位)
  1010. ;-------------------------------------------;
  1011. tsrflg        DB        0                        ; 常駐フラグ
  1012. argflg        DB        0                        ; 引数チェックフラグ
  1013. optflg        DB        0                        ; オプションフラグ
  1014. valflg        DB        0                        ; オプション数値フラグ
  1015. relflg        DB        0                        ; 常駐解除フラグ
  1016. hookflg        DB        0                        ; ベクタフックフラグ
  1017. ;
  1018. pspseg        DW        ?                        ; PSPセグメント
  1019. prgname        DB        13,'ACLAMPX v1.01',0Dh    ;
  1020. prgnamelen    EQU        $-prgname                ;
  1021. ;
  1022. msg0        DB        CR,LF,'Access Lamp 2  Version 1.01'
  1023.             DB        '  (C)パオパオ 1990-1993. '
  1024.             DB        CR,LF,0
  1025. msg1        DB        '★ 常駐します ★',CR,LF,0
  1026. msg2        DB        '☆ 常駐解除しました ☆',CR,LF,0
  1027. msg3        DB        '常駐しています.',CR,LF,0
  1028. msg4        DB        '常駐していません.',CR,LF,BEL,0
  1029. msg5        DB        'オプションパラメタ値を更新しました.',CR,LF,BEL,0
  1030. msg6        DB        'メモリの状態が正しくありません.',CR,LF,BEL,0
  1031. msg7        DB        'メモリの開放に失敗しました.',CR,LF,BEL,0
  1032. msg8        DB        'ベクタをフックされているため, 常駐解除できません.'
  1033.             DB        CR,LF,BEL,0
  1034. ;
  1035. clrmsg        DB        '           ','  '        ; F0~F3
  1036.             DB        '                    ','  '    ; H0~H6
  1037.             DB        '     ','  '            ; I0~I1
  1038.             DB        '                  '    ; CD~
  1039.             DB        0                        ;
  1040. ;
  1041. usage        DB        "Usage: 'ACLAMPX "
  1042.             DB        "[-r] [-f[n]] [-v[n]] [-x[n]] [-y[n]] [-t[n]]'"
  1043.             DB        CR,LF
  1044.             DB        '        -r       常駐解除       ',CR,LF
  1045.             DB        '        -f[n]    R/W以外も表示  '
  1046.             DB        'n: 0=しない, 1=する,   標準: 0',CR,LF
  1047.             DB        '        -v[n]    反転表示       '
  1048.             DB        'n: 0=しない, 1=する,   標準: 1',CR,LF
  1049.             DB        '        -x[n]    表示桁位置     '
  1050.             DB        'n: 1~80,              標準: 1',CR,LF
  1051.             DB        '        -y[n]    表示行位置     '
  1052. ;///////////////////////////////////////////;
  1053. IFNDEF HIGH_RESO                            ; ● 中解像度 ●
  1054.             DB        'n: 1~25,              標準: 25(最下行)',CR,LF
  1055. ELSE                                        ; ● 高解像度 ●
  1056.             DB        'n: 1~30,              標準: 25(最下行)',CR,LF
  1057. ENDIF                                        ;
  1058. ;///////////////////////////////////////////;
  1059.             DB        '        -t[n]    表示消去時間   '
  1060.             DB        'n: 10~100 (単位10ms), 標準: 50(0.5秒)',CR,LF
  1061.             DB        0
  1062. ;
  1063. code        ENDS                            ;
  1064.             END        entry                    ;
  1065. ;
  1066. ;============================================================================
  1067. ;    アトリビュート
  1068. ;
  1069. ;    Middle Resolution Display Type
  1070. ;
  1071. ;       7   6   5   4   3   2   1   0
  1072. ;    ┌─┬─┬─┬─┬─┬─┬─┬─┐
  1073. ;    └─┴─┴─┴─┴─┴─┴─┴─┘
  1074. ;      0  ↓   I  BLK REV  G   R   B
  1075. ;         KANJI
  1076. ;    .........................................................................
  1077. ;
  1078. ;    High Resolution Display Type
  1079. ;
  1080. ;       7   6   5   4   3   2   1   0
  1081. ;    ┌─┬─┬─┬─┬─┬─┬─┬─┐
  1082. ;    └─┴─┴─┴─┴─┴─┴─┴─┘
  1083. ;      0   0   0   0   I   G   R   B
  1084. ;
  1085. ;      15  14  13  12  11  10   9   8
  1086. ;    ┌─┬─┬─┬─┬─┬─┬─┬─┐
  1087. ;    └─┴─┴─┴─┴─┴─┴─┴─┘
  1088. ;      0  SCT UNS BLK REV VTL OVL UNL
  1089. ;    .........................................................................
  1090. ;
  1091. ;        G R B            G R B            G R B            G R B
  1092. ;    黒  0 0 0        青    0 0 1        赤    0 1 0        紫    0 1 1
  1093. ;    緑  1 0 0        水    1 0 1        黄    1 1 0        白    1 1 1
  1094. ;============================================================================
  1095. ;
  1096. ;    < HISTORY >
  1097. ;============================================================================
  1098. ;    1990.05.20 : CREATE
  1099. ;    1993.01.12 : ACLAMPX CREATE
  1100. ;    1993.03.02 : 常駐時にデフォルトオープンファイルをクローズするようにした.
  1101. ;============================================================================
  1102.  
  1103.